package com.rop.system.controller;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.rop.model.system.SysRole;
import com.rop.model.vo.AssignRoleVo;
import com.rop.model.vo.SysRoleQueryVo;
import com.rop.result.Result;
import com.rop.system.annotation.SysLog;
import com.rop.system.enums.BusinessType;
import com.rop.system.exception.BizException;
import com.rop.system.service.SysRoleService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;

import java.util.Arrays;
import java.util.List;
import java.util.Map;

/**
 * @Title: SysRoleController
 * @Author Rop
 * @Date 2023/4/6 21:39
 * @description: 角色接口层
 */

@Api(tags = "角色管理接口")
@Slf4j
@RestController
@RequestMapping("admin/system/sysRole")
public class SysRoleController {

    @Autowired
    private SysRoleService sysRoleService;

    /**
     * 查询所有角色
     *
     * @return 所有角色
     */
    @ApiOperation("查询所有角色")
    @GetMapping("findAll")
    public Result<List<SysRole>> findAll() {
        List<SysRole> sysRoles = sysRoleService.list();
        return Result.ok(sysRoles);
    }

    /**
     * 条件分页查询
     *
     * @param page           页数
     * @param limit          条数
     * @param sysRoleQueryVo 查询条件
     * @return 查询结果
     */
    @PreAuthorize("hasAuthority('bnt.sysRole.list')")
    @ApiOperation("条件分页查询")
    @GetMapping("{page}/{limit}")
    public Result<IPage<SysRole>> getList(@PathVariable Long page,
                                          @PathVariable Long limit,
                                          SysRoleQueryVo sysRoleQueryVo) {
        // 创建page对象
        Page<SysRole> pageParam = new Page<>(page, limit);
        // 调用service方法
        IPage<SysRole> pageModel = sysRoleService.getList(pageParam, sysRoleQueryVo);
        // 返回结果
        return Result.ok(pageModel);
    }

    /**
     * 根据id获取角色
     *
     * @param id 角色id
     * @return 角色详情
     */
    @PreAuthorize("hasAuthority('bnt.sysRole.list')")
    @ApiOperation("根据id获取角色")
    @GetMapping("get/{id}")
    public Result<SysRole> getSysRoleById(@PathVariable Long id) {
        SysRole sysRole = sysRoleService.getInfoById(id);
        return Result.ok(sysRole);
    }

    /**
     * 新增角色
     *
     * @param sysRole 角色信息
     * @return 是否成功新增
     */
    @SysLog(title = "角色管理", businessType = BusinessType.INSERT)
    @PreAuthorize("hasAuthority('bnt.sysRole.add')")
    @ApiOperation("新增角色")
    @PostMapping("save")
    public Result<Object> save(@RequestBody SysRole sysRole) {
        boolean isSuccess = sysRoleService.save(sysRole);
        return isSuccess ? Result.ok(sysRole.getId()) : Result.fail();
    }

    /**
     * 根据id删除角色--逻辑删除
     *
     * @param id 角色id
     * @return 删除是否成功标志
     */
    @PreAuthorize("hasAuthority('bnt.sysRole.remove')")
    @ApiOperation("根据id删除角色--逻辑删除")
    @DeleteMapping("remove/{id}")
    public Result<Boolean> removeRole(@PathVariable Long id) {
        boolean isSuccess = sysRoleService.removeById(id);
        return isSuccess ? Result.ok() : Result.fail();
    }

    /**
     * 批量删除角色
     *
     * @param ids 被删除的id集合
     * @return 删除是否成功
     */
    @PreAuthorize("hasAuthority('bnt.sysRole.remove')")
    @ApiOperation("批量删除角色")
    @DeleteMapping("batchRemove")
    public Result<Boolean> batchRemove(@RequestBody Long[] ids) {
        // 将id的数组类型转成集合类型
        List<Long> idList = Arrays.asList(ids);
        // 批量删除
        boolean isSuccess = sysRoleService.removeByIds(idList);
        return isSuccess ? Result.ok() : Result.fail();
    }

    /**
     * 修改角色
     *
     * @return 修改是否成功
     */
    @PreAuthorize("hasAuthority('bnt.sysRole.update')")
    @ApiOperation("修改角色")
    @PutMapping("update")
    public Result<Object> updateRole(@RequestBody SysRole sysRole) {
        boolean isSuccess = sysRoleService.updateById(sysRole);
        return isSuccess ? Result.ok(sysRole.getId()) : Result.fail();
    }

    /**
     * 一键恢复删除的角色
     *
     * @return 恢复是否成功
     */
    @ApiOperation("一键恢复删除的角色")
    @PutMapping("recover")
    public Result<Boolean> recover() {
        Boolean isSuccess = sysRoleService.recover();
        return isSuccess ? Result.ok() : Result.fail();
    }

    /**
     * 测试全局异常
     * 测试用例
     */
    @ApiOperation("测试全局异常")
    @GetMapping("exception")
    public void exception() {
        try {
            int a = 1 / 0;
        } catch (Exception e) {
            BizException.error(e.getMessage());
        }
    }

    /**
     * 获取用户的角色数据
     * @param userId 用户id
     * @return 结果集
     */
    @ApiOperation("获取用户角色数据")
    @GetMapping("getUserRoleByUserId/{userId}")
    public Result<Map<String, Object>> getUserRoleByUserId(@PathVariable Long userId) {
        return Result.ok(sysRoleService.getUserRoleById(userId));
    }

    /**
     * 用户分配角色
     *
     * @return 分配结果
     */
    @ApiOperation("用户分配角色")
    @PostMapping("doAssign")
    public Result<Boolean> doAssign(@RequestBody AssignRoleVo assignRoleVo) {
        return Result.ok(sysRoleService.doAssign(assignRoleVo));
    }
}
